/**
  * @file		filter.h
  * @brief		一阶互补滤波算法头文件。
  * @note		主要用于姿态传感器的数据处理。
  *	
  * @author 	FFerryman
  * @date		2025-7-20
  * @version 	1.0
  */
#ifndef __FILTER_H
#define __FILTER_H

#ifdef __cplusplus
extern "C" {
#endif

/** 
  * @brief  一阶互补滤波器结构体
  * @note   对于imu660ra姿态传感器，一般参数（通用参数）如下：  
  *             1.陀螺仪置信度gyro_ration = 4.0f;
  *             2.加速度计置信度acc_ration = 4.0f;
  *             3.调用周期call_cycle = 0.005f;
  *         对于俯仰角（需创建一个结构体参数）：
  *             gyro_data = &imu660ra_gyro_x;
  *             acc_data = &imu660ra_acc_y;
  *         对于翻滚角（需创建一个结构体参数）：
  *             gyro_data = &imu660ra_gyro_y;
  *             acc_data = &imu660ra_acc_x;
  *         对于误差角度mechanical_zero（每个轴不一样）：
  *             需要通过查看输出波形获得传感器各轴（俯仰角、翻滚角）为零的位置。
  *         使用的数据为filtering_angle（最终滤波角度）。
  * @example    创建结构体时就对参数进行初始化：
  *                 FilterStruct pitch_filter = {
  *                     .gyro_data      = &imu660ra_gyro_x;
  *                     .acc_data       = &imu660ra_acc_y;
  *                     .gyro_ration    = 4.0f;
  *                     .acc_ration     = 4.0f;
  *                     .call_cycle     = 0.005f;
  *                     .mechanical_zero= 52;
  *                     .angle_temp     = -52;//-mechanical_zero
  *                     .filtering_angle= -52;//-mechanical_zero
  *                     .call_cycle     = ;
  *                     .call_cycle     = ;
  *                 }
  */
typedef struct
{
    int16_t* gyro_data;     //要互补滤波的陀螺仪的数据
    int16_t* acc_data;      //要互补滤波的加速度的数据
    float gyro_ration;      //角速度置信度（通常4）
    float acc_ration;       //加速度置信度（通常4）
    float call_cycle;       //调用周期（通常5ms）
    float mechanical_zero;  //偏置角度（误差角度）
    float angle_temp;       //未去掉零点位置角度
    float filtering_angle;  //滤波后的最终角度
}FilterStruct;
void filter_fun(FilterStruct* filter_structure, int16_t gyro_data, int16_t acc_data);

#ifdef __cplusplus
}
#endif

#endif
